﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SGT_ON;
using System.IO;
using DevExpress.Web.ASPxUploadControl;
using DevExpress.Web.ASPxEditors;
using Aspose.Cells;

public partial class Producto : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //ClientScript.RegisterStartupScript(typeof(Page), "myScript", "uploadButton.DoClick()");
            //Page.RegisterStartupScript("myScript", "uploadButton.DoClick()");

            //lo pongo en estado insetar si el ID no es especificado o el numero es menor o igual a 0
            int _ID;
            if (Request.QueryString["ID"] == null)
                fvProducto.ChangeMode(FormViewMode.Insert);
            else
            {
                if (int.TryParse(Request.QueryString["ID"], out _ID) == true)
                    if (_ID <= 0)
                        fvProducto.ChangeMode(FormViewMode.Insert);
            }
        }
    }
    protected void txtBuscar_TextChanged(object sender, EventArgs e)
    {
        Buscar();
    }
    private void Buscar()
    {
        popBusqueda.ShowOnPageLoad = true;
        gvProveedores.DataBind();
    }

    protected void btnBuscar_Click1(object sender, ImageClickEventArgs e)
    {
        Buscar();
    }

    protected void fvPersonal_ItemInserting(object sender, FormViewInsertEventArgs e)
    {
        e.Values["EstaActivo"] = true.ToString();
    }
    protected void btnActivar_Click(object sender, EventArgs e)
    {
        ((HiddenField)fvProducto.FindControl("hfEstaActivo")).Value = true.ToString();
        fvProducto.UpdateItem(true);
    }
    protected void btnInactivo_Click(object sender, EventArgs e)
    {
        ((HiddenField)fvProducto.FindControl("hfEstaActivo")).Value = false.ToString();
        fvProducto.UpdateItem(true);
    }
    protected void dsUnidadDeMedida_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        StockProducto _producto = (StockProducto)e.ReturnValue;
        Response.Redirect("Producto.aspx?ID=" + _producto.ID.ToString());
    }
    protected void btnAceptarStock_Click(object sender, EventArgs e)
    {
        int _nuevoStock, _idProducto = -1;
        string _observaciones, _responsable;

        ////////////////////////////////////////
        //_idProducto
        if((Request.QueryString["ID"] != null)
            && (Request.QueryString["ID"] != ""))
            int.TryParse(Request.QueryString["ID"], out _idProducto);

        // si no es un id valido, salgo
        if(_idProducto <= 0)
            return;

        ////////////////////////////////////////
        // _nuevoStock
        _nuevoStock = int.Parse(((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtNuevaCantidad")).Text);

        //////////////////////////////////////
        // _observaciones
        _observaciones = ((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtObservacionesStock")).Text;

        /////////////////////////////////////////
        // _responsable
        _responsable = UsuarioActivo.ApellidoYNombre;

        StockMovimientoStock.GenerarMovimientoDeStock(_observaciones, _responsable, _nuevoStock, _idProducto);

        fvProducto.DataBind();
        //((DevExpress.Web.ASPxGridView.ASPxGridView)fvMarca.FindControl("ASPxPageControl1").FindControl("gvMovimientos")).DataBind();
        //((DevExpress.Web.ASPxEditors.ASPxLabel)fvMarca.FindControl("ASPxPageControl1").FindControl("lblCantidadActual")).DataBind();
    }
    public SGT_ON.ONEmpleado UsuarioActivo
    {
        get
        {
            string _usuarioId = Page.User.Identity.Name;
            return SGT_ON.ONEmpleado.ObtenerEmpleadoPorUsuarioID(_usuarioId);
        }
    }
    protected void chkTienenumeroDeSerie_DataBound(object sender, EventArgs e)
    {
        DevExpress.Web.ASPxEditors.ASPxCheckBox _checkBox = (DevExpress.Web.ASPxEditors.ASPxCheckBox)sender;

        DevExpress.Web.ASPxEditors.ASPxButton _boton = ((DevExpress.Web.ASPxEditors.ASPxButton)fvProducto.FindControl("ASPxPageControl1").FindControl("btnAceptarStock"));
        
        if (_checkBox.Checked == true)
        {
            _boton.Enabled = false;
            _boton.ToolTip = "El producto es único ya que tiene número de serie propio y no se puede modificar la cantidad.";
        }
        else
        {
            _boton.Enabled = true;
            _boton.ToolTip = "";
        }
    }
    /// <summary>
    /// Obtiene el producto activo que se esta editando.
    /// Se utiliza esto ya que los controles enlazados dentro de los tabs, no se enlazan correctamente.
    /// </summary>
    protected SGT_ON.StockProducto ActualizarProducto()
    {
            SGT_ON.StockProducto _producto = StockProducto.CrearStockProducto(ObtenerIdActivo);

            _producto.Nombre = ((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtnombre")).Text;
            _producto.Marca = ((DevExpress.Web.ASPxEditors.ASPxComboBox)fvProducto.FindControl("ASPxPageControl1").FindControl("cmbMarca")).SelectedItem.Value.ToString();
            // QUEDA EL MISMO VALOR ANTERIOR _producto.Cantidad = ObtenerEnteroDeTexto(((DevExpress.Web.ASPxEditors.ASPxComboBox)fvMarca.FindControl("ASPxPageControl1").FindControl("txtCantidadDeReposicion")).SelectedItem.Value.ToString());
            _producto.CantidadReposicion = ObtenerEnteroDeTexto(((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtCantidadDeReposicion")).Text);
            _producto.CodigoOriginal = ((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtCodigoOriginal")).Text;
            _producto.EsNuevo = ((DevExpress.Web.ASPxEditors.ASPxCheckBox)fvProducto.FindControl("ASPxPageControl1").FindControl("chkEsNuevo")).Checked;
            _producto.EsComercializable = ((DevExpress.Web.ASPxEditors.ASPxCheckBox)fvProducto.FindControl("ASPxPageControl1").FindControl("chkEsComercializable")).Checked;
            _producto.TieneNumeroDeSerie = ((DevExpress.Web.ASPxEditors.ASPxCheckBox)fvProducto.FindControl("ASPxPageControl1").FindControl("chkTienenumeroDeSerie")).Checked;
            _producto.PrecioCosto = ObtenerDecimalDeTexto(((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtPrecioCosto")).Text);
            _producto.PrecioVenta = ObtenerDecimalDeTexto(((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtPrecioVenta")).Text);

            try
            {
                _producto.IVA = ObtenerDecimalDeTexto(((DevExpress.Web.ASPxEditors.ASPxComboBox)fvProducto.FindControl("ASPxPageControl1").FindControl("cmbIVA")).SelectedItem.Value.ToString());
            }
            catch
            {
                _producto.IVA = decimal.Zero;
            }
            _producto.TipoDeProducto = ((DevExpress.Web.ASPxEditors.ASPxComboBox)fvProducto.FindControl("ASPxPageControl1").FindControl("cmbTipoDeProducto")).SelectedItem.Value.ToString();
            _producto.Ubicacion = ((DevExpress.Web.ASPxEditors.ASPxTextBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtUbicacion")).Text;
            _producto.UnidadDeMedida = ((DevExpress.Web.ASPxEditors.ASPxComboBox)fvProducto.FindControl("ASPxPageControl1").FindControl("txtUnidadDeMedida")).SelectedItem.Value.ToString();
            _producto.Descripcion = ((DevExpress.Web.ASPxEditors.ASPxMemo)fvProducto.FindControl("ASPxPageControl1").FindControl("txtObservaciones")).Text;

            _producto.Actualizar();
            return _producto;
    }
    protected int ObtenerEnteroDeTexto(string pTexto)
    {
        if (pTexto == "")
            return 0;

        int _resultado;
        if (int.TryParse(pTexto, out _resultado) == false)
            return 0;

        return _resultado;
    }
    protected decimal ObtenerDecimalDeTexto(string pTexto)
    {
        if (pTexto == "")
            return decimal.Zero;
                
        return Utilidades.ConvertirADecimal(pTexto);
    }
    protected int ObtenerIdActivo
    {
        get
        {
            if ((Request.QueryString["ID"] == null)
                || (Request.QueryString["ID"] == ""))
                return -1;

            int _id;
            if (int.TryParse(Request.QueryString["ID"], out _id) == false)
                return -1;

            if (_id <= 0)
                return -1;

            return _id;
        }
    }
    protected void dsProducto_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    {
        ActualizarProducto();
        e.Cancel = true;
    }
    protected void dsProducto_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
    {
        StockProducto _producto = (StockProducto)e.InputParameters[0];

        //los porcentajes
        _producto.Responsable = UsuarioActivo.ApellidoYNombre;
    }
    private string ObtenerCarpeta()
    {
        string _carpeta = MapPath("~/Fotos") +"\\Productos";
        //Directory.GetCurrentDirectory()
        if (Directory.Exists(_carpeta) == false)
            Directory.CreateDirectory(_carpeta);
        //Directory.Delete(directoryString);

        return _carpeta;
    }
    protected void SubirArchivo_FileUploadComplete(object sender, DevExpress.Web.ASPxUploadControl.FileUploadCompleteEventArgs e)
    {
        try
        {
            e.CallbackData = SavePostedFiles(e.UploadedFile);
            StockProducto _producto = StockProducto.CrearStockProducto(int.Parse(Request.QueryString["ID"]));
            _producto.FotoURL = e.CallbackData;
            _producto.Actualizar();
            //((ASPxImage)fvProducto.FindControl("ASPxPageControl1").FindControl("imgFoto")).DataBind();
            
        }
        catch (Exception ex)
        {
            e.IsValid = false;
            e.ErrorText = ex.Message;
        }
    }
    protected string SavePostedFiles(UploadedFile uploadedFile)
    {
        string ret = "";
        if (uploadedFile.IsValid)
        {
            string _ruta = ObtenerCarpeta();
            FileInfo fileInfo = new FileInfo(uploadedFile.FileName);
            ret = _ruta + "\\" + Request.QueryString["ID"] + fileInfo.Extension;
            //ret = _ruta + "\\" + uploadedFile.FileName.Replace(" ", "_").; ;//reemplazo espacios por guiones bajos            
            uploadedFile.SaveAs(ret);

            ret = "~/Fotos/Productos/" + Request.QueryString["ID"] + fileInfo.Extension;
            //FileInfo fileInfo = new FileInfo(uploadedFile.FileName);
            //string resFileName = MapPath(UploadDirectory) + fileInfo.Name;
            //uploadedFile.SaveAs(resFileName);

            //string fileLabel = fileInfo.Name;
            //string fileType = uploadedFile.PostedFile.ContentType.ToString();
            //string fileLength = uploadedFile.PostedFile.ContentLength / 1024 + "K";
            //ASPxUploadControl _control = (ASPxUploadControl)fvProducto.FindControl("ASPxPageControl1").FindControl("SubirArchivo");
            //ret = string.Format("{0} <i>({1})</i> {2}|{3}", fileLabel, fileType, fileLength, fileInfo.Name);
        }
        return ret;
    }
    protected void ASPxCallbackPanel1_Callback(object sender, DevExpress.Web.ASPxClasses.CallbackEventArgsBase e)
    {

        //(fvProducto.FindControl("ASPxCallbackPanel1").FindControl("imgFoto") as ASPxImage);
        
    }
    protected void btnrecargarImagen_Click(object sender, EventArgs e)
    {
        fvProducto.DataBind();
    }
    protected void btnActualizar_Click(object sender, EventArgs e)
    {

    }
    protected void ValidarCombo(object source, ServerValidateEventArgs args)
    {
        if (((ASPxComboBox)fvProducto.FindControl("ASPxPageControl1").FindControl(((CustomValidator)source).ControlToValidate)).SelectedIndex == -1)
                args.IsValid = false;
            else
                args.IsValid = true;
    }
    protected void lnkGenerarEtiqueta_Click(object sender, EventArgs e)
    {
        GenerarEtiqueta();
    }
    private void GenerarEtiqueta()
    {
        int _idActivo = ObtenerIdActivo;

        if(_idActivo == -1)
            return;

        StockProducto _producto = StockProducto.CrearStockProducto(_idActivo);
        //CodigoDeBarra.Code39 code = new CodigoDeBarra.Code39(_producto.ID.ToString());
        CodigoDeBarra.Code39 code = new CodigoDeBarra.Code39(_producto.ID.ToString());

        //Guardo el archivo
        string path = System.Web.HttpContext.Current.Server.MapPath("~");
        path += "\\Archivos\\CodigoBarra.png";
                
        code.Paint().Save(path, System.Drawing.Imaging.ImageFormat.Png);

        string _rutaEtiquetaGenerada;
        _rutaEtiquetaGenerada = GenerarEtiquetaExcel(path, _producto);
        if (_rutaEtiquetaGenerada == "")
            return;
        else
            Response.Redirect(_rutaEtiquetaGenerada);


    }
    /// <summary>
    /// Genera la etiqueta y la almacena en la carpeta Archivo
    /// </summary>
    /// <returns>Devuelve la url donde esta el archivo.</returns>
    protected static string GenerarEtiquetaExcel(string pPathImagen, StockProducto pProducto)
    {
        #region Ubicación textos
        string _NombreTitulo = "A1";
        string _NombreTexto = "C1";
        string _MarcaTitulo = "A2";
        string _MarcaTexto= "C2";
        string _UbicacionTitulo = "A3";
        string _UbicacionTexto = "C3";
        //string _CodigoTallerTitulo = "G11";
        //string _CodigoTallerTexto = "P8";
        string _CodigoOriginalTitulo = "A4";
        string _CodigoOriginalTexto = "C4";
        string _Imagen = "A5";
        #endregion


        if ((pProducto == null)
            || (pProducto.ID <= 0))
            return "";
        
        //Abro el archivo plantilla
        //Instantiate a new workbook
        Workbook workbook = new Workbook();
        //Open template
        string path = System.Web.HttpContext.Current.Server.MapPath("~");
        path += Parametros.RutaPlantillaEtiqueta;

        workbook.Open(path);

        //Get the first worksheet in the workbook
        Worksheet worksheet = workbook.Worksheets[0];

        //Get the cells collection in the sheet
        Cells cells = worksheet.Cells;

        #region Encabezado
        //Datos de encabezado
        cells[_NombreTitulo].PutValue("Item:");
        cells[_NombreTexto].PutValue(pProducto.Nombre);
        cells[_UbicacionTitulo].PutValue("Ubicación:");
        cells[_UbicacionTexto].PutValue(pProducto.Ubicacion);
        cells[_MarcaTitulo].PutValue("Marca:");
        cells[_MarcaTexto].PutValue(pProducto.Marca);
        cells[_CodigoOriginalTitulo].PutValue("C. original:");
        cells[_CodigoOriginalTexto].PutValue(pProducto.CodigoOriginal);
        //cells[_Imagen]..PutValue(_presupuesto.Modelo);

        #endregion

        #region codigo de barra
        //string _rutaImagen = System.Web.HttpContext.Current.Server.MapPath("~") + "\\images\\Firma.png";
        string _rutaImagen = pPathImagen;
        int _escala = 80;
        int _indexDeImagen;

        _indexDeImagen = worksheet.Pictures.Add(4, 0, _rutaImagen, _escala, _escala);
        worksheet.Pictures[_indexDeImagen].Placement = PlacementType.MoveAndSize;
        #endregion

        string pNombreArchivo =  "Etiqueta.xls";
        pNombreArchivo = pNombreArchivo.Replace(char.Parse("/"), char.Parse("-")).Replace(char.Parse("\\"), char.Parse("-"));
        pNombreArchivo = pNombreArchivo.Replace(" ", "");
        pNombreArchivo = pNombreArchivo.Replace("--", "-");
        pNombreArchivo = System.Web.HttpContext.Current.Server.MapPath("~") + "\\Archivos\\" + pNombreArchivo;
        workbook.Save(pNombreArchivo);
        //workbook.Save(this.Request.PhysicalApplicationPath + "Archivos\\" + pNombreArchivo);
        workbook = null;
        //Response.Redirect(this.Request.ApplicationPath + "/Archivos/" + pNombreArchivo);
        return "~/Archivos/Etiqueta.xls";
    }
}